package cn.tedu.test.charging.rabbitmq;

import com.rabbitmq.client.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.Date;
import java.util.concurrent.TimeoutException;

/**
 * 测试消息生产发送
 */
public class Producer {
    //管理一个连接对象
    private Channel channel;
    @Before
    public void init() throws IOException, TimeoutException {
        //创建一个连接工厂,提供工厂的参数 连接rabbtimq的参数
        ConnectionFactory factory = new ConnectionFactory();
        //rabbitmq-server服务端 ip 与 端口 TCP协议
        factory.setHost("192.168.8.100");
        factory.setPort(5672);
        //提供用户名密码 本地local guest/guest 虚拟机admin/123456
        factory.setUsername("admin");
        factory.setPassword("123456");
        //rabbitmq virtual做数据隔离 连接的虚拟主机不一样,能够使用的交换机 队列 消息 是不同
        factory.setVirtualHost("/");
        Connection connection = factory.newConnection();
        channel= connection.createChannel();
    }
    //组织发送一个消息数据
    @Test
    public void sendMessage() throws IOException, TimeoutException {
        /**
         * String exchange: 交换机名称 如果为空字符串,表示使用默认交换机,默认交换机名称为空字符串
         * String routingKey: 路由键,根据路由键将消息发送到指定的队列中 默认交换机 是所有声明队列必定绑定的交换机
         * BasicProperties props: 消息的属性,消息除了 内容 消息体 消息信息数据以外,
         * 可以额外的携带绑定一些属性 比如消息的优先级,消息的过期时间,消息所属来运用户id appId 几乎消息所有属性
         * 都是为了丰富消费者的业务使用的
         * byte[] body: 消息体,消息的数据.二进制消息体.消息数据想携带的内容生产者一方 要进行序列化 消费者反序列化
         */
        //调用channel的api
        channel.basicPublish("BIZ_EXCHANGE","",null,"我的第一条延迟消息".getBytes());
        System.out.println("发送消息结束,发送消息时间点是:"+new Date().toLocaleString());
    }
}
